const fs = require('fs');
const path = require('path');

// bagFunc 目录路径
const BAG_FUNC_DIR = path.resolve(__dirname, '../src/service/bagFunc');

// 模板文件内容
const TEMPLATE_CONTENT = `import { Item } from "../../shared/face/index";
import { BaseBody } from '../../core/rpg';
import { BagFuncResult } from './types';

/**
 * {functionName} 功能
 * @param useItem 使用的物品
 * @param useCount 使用数量
 * @param funcData 函数数据
 * @param player 玩家对象
 * @returns 使用结果
 */
export async function {functionName}(useItem: Item, useCount: number, funcData: any, player: BaseBody): Promise<BagFuncResult> {
    try {
        // TODO: 实现具体逻辑
        
        return {
            success: true,
            message: '功能执行成功',
            data: { action: '{functionName}' }
        };
    } catch (error: any) {
        return {
            success: false,
            message: '功能执行失败',
            data: { error: error.message }
        };
    }
}
`;

/**
 * 生成函数模板
 * @param {string} functionName 函数名
 * @returns {string} 模板内容
 */
function generateTemplate(functionName) {
    return TEMPLATE_CONTENT.replace(/{functionName}/g, functionName);
}

/**
 * 检查文件是否已存在
 * @param {string} filePath 文件路径
 * @returns {boolean} 是否存在
 */
function fileExists(filePath) {
    return fs.existsSync(filePath);
}

/**
 * 创建新文件并生成模板
 * @param {string} fileName 文件名（不含扩展名）
 */
function createBagFuncFile(fileName) {
    const filePath = path.join(BAG_FUNC_DIR, `${fileName}.ts`);
    
    try {
        // 检查文件是否存在且有内容
        if (fileExists(filePath)) {
            const content = fs.readFileSync(filePath, 'utf8');
            if (content.trim()) {
                console.log(`⚠️  文件已存在且有内容: ${fileName}.ts`);
                return;
            }
        }
        
        const template = generateTemplate(fileName);
        fs.writeFileSync(filePath, template, 'utf8');
        console.log(`✅ 已创建/更新 bagFunc 文件: ${fileName}.ts`);
        console.log(`📝 请编辑 ${fileName}.ts 实现具体逻辑`);
    } catch (error) {
        console.error(`❌ 创建文件失败: ${error.message}`);
    }
}

/**
 * 监听目录变化
 */
function watchBagFuncDirectory() {
    console.log('🔍 开始监听 bagFunc 目录...');
    console.log(`📁 监听路径: ${BAG_FUNC_DIR}`);
    console.log('💡 提示: 在 bagFunc 目录中创建新的 .ts 文件会自动生成模板');
    console.log('📋 示例: touch src/service/bagFunc/myNewFunction.ts');
    console.log('');

    // 使用 fs.watch 监听目录
    const watcher = fs.watch(BAG_FUNC_DIR, { recursive: false }, (eventType, filename) => {
        if (eventType === 'rename' && filename) {
            // 只处理 .ts 文件
            if (filename.endsWith('.ts') && !filename.startsWith('.') && filename !== 'index.ts' && filename !== 'types.ts') {
                const fileName = filename.replace('.ts', '');
                const filePath = path.join(BAG_FUNC_DIR, filename);
                
                // 检查文件是否存在
                if (fs.existsSync(filePath)) {
                    try {
                        // 检查文件内容是否为空
                        const content = fs.readFileSync(filePath, 'utf8');
                        if (!content.trim()) {
                            console.log(`🔄 检测到新文件: ${filename}`);
                            createBagFuncFile(fileName);
                        } else {
                            console.log(`ℹ️  文件 ${filename} 已有内容，跳过模板生成`);
                        }
                    } catch (error) {
                        console.log(`🔄 检测到新文件: ${filename}`);
                        createBagFuncFile(fileName);
                    }
                }
            }
        }
    });

    watcher.on('error', (error) => {
        console.error('❌ 监听器错误:', error);
    });

    return watcher;
}

/**
 * 手动创建文件
 * @param {string} functionName 函数名
 */
function manualCreate(functionName) {
    if (!functionName) {
        console.log('❌ 请提供函数名');
        console.log('用法: node scripts/bagFunc-watcher.js create <functionName>');
        return;
    }
    
    createBagFuncFile(functionName);
}

/**
 * 列出所有 bagFunc 文件
 */
function listBagFuncFiles() {
    console.log('📋 当前 bagFunc 文件列表:');
    console.log('');
    
    const files = fs.readdirSync(BAG_FUNC_DIR);
    const bagFuncFiles = files.filter(file => 
        file.endsWith('.ts') && 
        file !== 'index.ts' && 
        file !== 'types.ts'
    );
    
    if (bagFuncFiles.length === 0) {
        console.log('  暂无 bagFunc 文件');
    } else {
        bagFuncFiles.forEach(file => {
            const functionName = file.replace('.ts', '');
            console.log(`  ✅ ${functionName}`);
        });
    }
    
    console.log('');
}

// 主函数
function main() {
    const args = process.argv.slice(2);
    const command = args[0];
    
    switch (command) {
        case 'create':
            manualCreate(args[1]);
            break;
        case 'list':
            listBagFuncFiles();
            break;
        case 'watch':
        default:
            watchBagFuncDirectory();
            break;
    }
}

// 如果直接运行此脚本
if (require.main === module) {
    main();
}

module.exports = {
    createBagFuncFile,
    generateTemplate,
    watchBagFuncDirectory
}; 